// 封装axios请求方法
import axios from 'axios'
import store from '@/store'

// 实例一个axios对象
const instance = axios.create({
  baseURL: 'http://pcapi-xiaotuxian-front-devtest.itheima.net',
  timeout: 10000
})

// 请求拦截器--// 请求头全局注入token
instance.interceptors.request.use(config => {
  // Do something before request is sent
  // 注入token
  const token = store.state.user.porfile.token
  if (token) {
    config.headers.Authorization = `Bearer ${token}`
  }
  return config
}, error => {
  // Do something with request error
  return Promise.reject(error)
})

// 响应拦截器--响应处理 401状态码，还有可以有业务状态码需要判断
instance.interceptors.response.use(response => {
  // Do something before response is sent
  return response.data
}, error => {
  // Do something with response error
  return Promise.reject(error)
})

// 需求：封装一个方法，适配api的请求
/**
 * 用法效果：
 *    request(url,get,data/params).then(res=> log(res)).catch(err => log(err))
 * 前提：
 *    当前小兔鲜项目中请求方法只有俩种，get和post
 * 优化：
 *    不管用户传过来的是大写还是小写，我们统一转换为小写，然后再进行三元表达式比较
 *    这样会是程序更加健壮
 *
 */

/**
 *
 * @param {*} url 请求接口的url地址
 * @param {*} method 请求接口的method方法
 * @param {*} submitData 请求接口时携带的数据，对象格式
 * @returns 把响应结果通过return return出去，供调用位置使用响应结果
 */

// 封装通用的请求函数
function request (url, method, submitData) {
  // 需要在其他位置调用这个封装的请求函数的时候获取到响应的结果，.then.catch，我们需要把响应return一个Promise对象，
  // 而instance原地返回的就是一个Promise对象，我们直接ruturn出去即可，一定需要return出去，否则不能.then
  return instance({
    url,
    method,
    // 请求体应该根据传下来的method请求方法进行判断
    [method.toLocaleLowerCase() === 'get' ? 'params' : 'data']: submitData
  })
}

export default request
